package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

func main() {
	myjob2()

}

//分批执行任务2
func myjob2() {
	c := make(chan bool, 5)

	for i := 0; i < 10000; i++ {
		c <- true
		go func(x int) {
			fmt.Println(x)
			time.Sleep(time.Second)
			<-c
		}(i)

	}

}

//分批执行任务
func myjob() {

	//播撒随机种子(初始化系统资源)
	rand.Seed(time.Now().Unix())

	c := make(chan bool)
	go func() {
		for {
			for i := 0; i < 5; i++ {
				c <- true
			}
			time.Sleep(time.Second)
		}

	}()
	for {
		do(c)
	}

}

func do(c chan bool) {
	<-c
	fmt.Println(rand.Intn(10))

}

// ---------------------------------------------------------------------------------------------
//分批执行任务，必须所有任务执行完才发放另一批任务

func myjob3() {
	i := 1
	//播撒随机种子(初始化系统资源)
	rand.Seed(time.Now().Unix())
	c := make(chan bool, 5)
	//先发放第一次任务
	fmt.Println("开始发放第一次任务")
	pool(c)

	//发放完地一次任务之后wg开始计数
	wg := sync.WaitGroup{}
	wg.Add(5)

	go func() {
		for {
			//等待计数完成
			wg.Wait()
			i++
			fmt.Printf("开始发放第%v次任务\n", i)
			pool(c)
			//重新开始计数
			wg.Add(5)
		}

	}()

	for {
		<-c
		go func() {
			//计数
			defer wg.Done()
			do3()
		}()

	}
}

func do3() {
	fmt.Println(rand.Intn(10))
	time.Sleep(3 * time.Second)
}

func pool(c chan bool) {

	for i := 0; i < 5; i++ {
		c <- true
	}
}

func job() {

	i := 0
	c := make(chan bool, 5)

	i++
	fmt.Printf("开始发放第%v次任务\n", i)
	poll(c)
	wg := sync.WaitGroup{}
	wg.Add(5)
	go func() {

		for {
			wg.Wait()
			i++
			fmt.Printf("开始发放第%v次任务\n", i)
			poll(c)
			wg.Add(5)
		}
	}()

	for {
		<-c
		go func() {
			defer wg.Done()
			tod()
		}()
	}
}

func poll(c chan bool) {
	for i := 0; i < 5; i++ {
		c <- true
	}
}

func tod() {
	fmt.Println(rand.Intn(10))
	time.Sleep(2 * time.Second)
}
